package com.javabasic.concurrency;

/**
 * @Author xiongmin
 * @ClassName VolatileTest
 * @Description TODO
 * @Date 2019/8/18 13:57
 * @Version 1.0
 *
 *
 * 一、volatile 关键字： 当多个线程进行操作共享数据是，可以保证内存中的数据可见
 *                      相较于sycchronized 是一种较为轻量级的同步策略
 *
 * 注意：
 * 1. volatile 不具备互斥性
 * 2. volatile 不能保证变量的原子性
 **/
public class VolatileTest {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        new Thread(myThread).start();

        while (true) {
//            synchronized (myThread) { // 加锁效率太低
                if (myThread.getFlag()) {
                    System.out.println("------------flag是真----------");
                    break;
                }
//            }

        }

    }
}

class MyThread implements Runnable {

    private Boolean flag = false;

    public Boolean getFlag() {
        return flag;
    }

    public void setFlag(Boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.flag = true;
        System.out.println("flag = " + getFlag());
    }
}
